/*******************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.        */
/*                                                                 */
/*  NAME      = module.h                                           */
/*  NOTE      = 模块通信公用结构体                                 */
/*  DATE      = 2014/10/31                                         */
/*******************************************************************/

#ifndef __MODULE_COMM_H_
#define __MODULE_COMM_H_

#include "frmem.h"
#include "frstr.h"
#include "frhashmap_varfield.h"

/* 端口范围 */
typedef struct __st_port_range {
    u_short us_port_start;
    u_short us_port_end;
} frport_range;

typedef enum __em_analyz_cmd
{
    FRANALYZ_CMD_SYN = 1,
    FRANALYZ_CMD_FIN ,
    FRANALYZ_CMD_DATA,
    FRANALYZ_CMD_UNKNOWN,
}Franalyz_cmd;

struct __st_analyze_data {
    int i_direction;                /* 当前数据方向 */
    u_int src_ip, dst_ip;
    u_short src_port, dst_port;
    struct timeval st_timestamp;    /* 数据包发生时间 */

    Franalyz_cmd em_analyz_cmd;     /* FRANALYZ_CMD_FIN FRANALYZ_CMD_DATA */
    char *p_payload;                /* 数据包内容，可以为空 */
    unsigned int ui_payload_len;    /* 数据包长度 */

    int i_l7_proto;                 /* L7层模块代号 */
    Frhashmap_header *p_st_request_fields; /* 产出物，请求，可以为空 */
    Frhashmap_header *p_st_respones_fields;/* 产出物，应答，可以为空 */
};

/* 协议分析入力数据 */
typedef struct __st_analyze_data Analyze_data_in;
/* 协议分析出力数据 */
typedef struct __st_analyze_data Analyze_data_out;

typedef struct __st_l7_module L7_module;

typedef struct __st_L7_transaction {
    int  i_status;              /* 某个请求正在请求中APM_L7_IN_PROGRESS */
    char *p_transaction_code;   /* 交易码，一般从request中提取。NULL表示没有 */
    char *p_transaction_title;  /* 标识符。NULL表示没有 */
    char *p_server_name;        /* 检查到的服务器名称，如Apache 2.0 */
    int  i_batch_count;         /* 批处理长度，默认为1 */
    char *p_xml_fields;         /* XML输出结果，如果传统的KV结构无法表述时可选用XML表达，按XML规范存储 */

    /*
    *  应答的状态码有多个，例如在HTTP之上承载的XML协议，用户可能在XML中定义了请求的最终应答状态，
    *  所以，状态码应以能识别的最上层协议的为准
    */
    long  l_response_code;          /* 应答的状态码，存放数值  */
    char *p_response_codestring;    /* 应答的状态码串，如HTTP的 200 OK */
    //char *p_response_status;      /* 应答的状态码, 如影响多少行数据 */
} L7_transaction;

typedef struct __st_L4_transaction {
    /* 请求和应答相关的时间、数据 */
    struct timeval st_request_time_first_byte; /* 请求发起的第一个数据包时间 */
    struct timeval st_request_time_start;      /* 请求数据第一个分片包发送的时间 */
    struct timeval st_request_time;            /* 所有请求数据发送完的时间 */
    long   l_request_bytes;                    /* 请求字节数，in bytes */

    struct timeval st_response_time_first_byte; /* 收到第一个应答包时间 */
    struct timeval st_response_time;            /* 所有应答包数据接收完的时间 */
    long   l_response_bytes;                    /* 应答的字节数， in bytes */

    unsigned long ul_response_time_firstbyte_us;/* 首包时间，是指从请求发起到收到第一个应答包时间，使用微秒表示 */
    unsigned long ul_response_time_us;          /* 应答时间，是指从请求发起到所有应答结束总花费的时间，使用微秒表示 */
} L4_transaction;


#endif
